home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / sound / convert / st2sparc.txt < prev   
Text File  |  1994-08-27  |  7KB  |  201 lines

  1.  
  2. [Note:  This will work on the ST sounds archived here too, since they're
  3.     in the same format as Mac sounds. - D. Baggett]
  4.  
  5. From wam!haven!uflorida!mailrus!uwm.edu!zaphod.mps.ohio-state.edu!usc!apple!bionet!arisia!ebert Wed May  9 00:32:45 EDT 1990
  6. Article 399 of alt.tv.simpsons:
  7. Path: wam!haven!uflorida!mailrus!uwm.edu!zaphod.mps.ohio-state.edu!usc!apple!bionet!arisia!ebert
  8. >From: ebert@arisia.Xerox.COM (Robert Ebert)
  9. Newsgroups: alt.tv.simpsons
  10. Subject: Mac sounds --> SS1
  11. Summary: sample --> uLaw
  12. Keywords: sound
  13. Message-ID: <8742@arisia.Xerox.COM>
  14. Date: 8 May 90 22:25:43 GMT
  15. References: <1990May8.161221.21810@caen.engin.umich.edu> <24969@eerie.acsu.Buffalo.EDU>
  16. Reply-To: bebert.osbunorth@xerox.com (Bob Ebert)
  17. Organization: Xerox Sunnyvale System Software Unit
  18. Lines: 180
  19.  
  20. In article <24969@eerie.acsu.Buffalo.EDU> ajay@sybil.cs.Buffalo.EDU (Ajay Shekhawat) writes:
  21. >We have a bunch of SPARCs here. I saw the MAC sounds, but can think of no
  22. >way to convert them into a format that could be used by the SS1.
  23. >Could some kind soul please convert those sounds into the SS1 format, and
  24. >post it, or put a copy in xanth's simpsons' directory?  Muchos Gracias!
  25.  
  26. Okay... compile the following, and use it on the DATA fork of Mac sounds.
  27. You can use SS1 sound programs to play the result, or just cat it to
  28. /dev/audio.  Have fun!
  29.  
  30.             --Bob
  31.  
  32. /************************************************************************/
  33. /*      Copyright 1989 by Rich Gopstein and Harris Corporation          */
  34. /*                                                                      */
  35. /*      Permission to use, copy, modify, and distribute this software   */
  36. /*      and its documentation for any purpose and without fee is        */
  37. /*      hereby granted, provided that the above copyright notice        */
  38. /*      appears in all copies and that both that copyright notice and   */
  39. /*      this permission notice appear in supporting documentation, and  */
  40. /*      that the name of Rich Gopstein and Harris Corporation not be    */
  41. /*      used in advertising or publicity pertaining to distribution     */
  42. /*      of the software without specific, written prior permission.     */
  43. /*      Rich Gopstein and Harris Corporation make no representations    */
  44. /*      about the suitability of this software for any purpose.  It     */
  45. /*      provided "as is" without express or implied warranty.           */
  46. /************************************************************************/
  47.  
  48. /************************************************************************/
  49. /* sound2sun.c - Convert sampled audio files into uLAW format for the   */
  50. /*               Sparcstation 1.                                        */
  51. /*               Send comments to ..!rutgers!soleil!gopstein            */
  52. /************************************************************************/
  53. /*                                    */
  54. /*  Modified November 27, 1989 to convert to 8000 samples/sec           */
  55. /*   (contrary to man page)                                             */
  56. /*                                    */
  57. /*  Fixed Bug with converting slow sample speeds            */
  58. /*                                    */
  59. /************************************************************************/
  60.  
  61.  
  62. #include <stdio.h>
  63.  
  64. #define DEFAULT_FREQUENCY 11000
  65.  
  66. FILE *infile, *outfile;
  67.  
  68. /* convert two's complement ch into uLAW format */
  69.  
  70. unsigned int cvt(ch)
  71. int ch;
  72. {
  73.  
  74.   int mask;
  75.  
  76.   if (ch < 0) {
  77.     ch = -ch;
  78.     mask = 0x7f;
  79.   } else {
  80.     mask = 0xff;
  81.   }
  82.  
  83.   if (ch < 32) {
  84.     ch = 0xF0 | 15 - (ch / 2);
  85.   } else if (ch < 96) {
  86.     ch = 0xE0 | 15 - (ch - 32) / 4;
  87.   } else if (ch < 224) {
  88.     ch = 0xD0 | 15 - (ch - 96) / 8;
  89.   } else if (ch < 480) {
  90.     ch = 0xC0 | 15 - (ch - 224) / 16;
  91.   } else if (ch < 992) {
  92.     ch = 0xB0 | 15 - (ch - 480) / 32;
  93.   } else if (ch < 2016) {
  94.     ch = 0xA0 | 15 - (ch - 992) / 64;
  95.   } else if (ch < 4064) {
  96.     ch = 0x90 | 15 - (ch - 2016) / 128;
  97.   } else if (ch < 8160) {
  98.     ch = 0x80 | 15 - (ch - 4064) /  256;
  99.   } else {
  100.     ch = 0x80;
  101.   }
  102. return (mask & ch);
  103. }
  104.       
  105. /*******************************************************
  106. /*                                                     */
  107. /* Usage is "sound2sun [-f frequency] infile outfile"  */
  108. /*                                                     */
  109. /* "frequency" is the samples per second of the infile */
  110. /* the outfile is always 8000 samples per second.      */
  111. /*                                                     */
  112. /*******************************************************/
  113.  
  114. /***********************************************************************/
  115. /*                                                                     */
  116. /* The input file is expected to be a stream of one-byte excess-128    */
  117. /* samples.  Each sample is converted to 2's complement by subtracting */
  118. /* 128, then converted to uLAW and output.  We calculate the proper    */
  119. /* number of input bytes to skip in order to make the sample frequency */
  120. /* convert to 8000/sec properly.  Interpolation could be added, but it */
  121. /* doesn't appear to be necessary.                                     */
  122. /*                                                                     */
  123. /***********************************************************************/
  124.  
  125.  
  126. main(argc, argv)
  127. int argc;
  128. char *argv[];
  129. {
  130.  
  131.   float sum = 0;
  132.   float frequency, increment;
  133.  
  134.   unsigned char ch;
  135.   unsigned char ulaw;
  136.  
  137.   int chr;
  138.  
  139.   if ((argc != 3) && (argc != 5)) {
  140.     fprintf(stderr,"Usage: sound2sun [-f frequency] infile outfile\n");
  141.     exit(1);
  142.   }
  143.  
  144.   if (argc == 5) {
  145.     if (strcmp(argv[1], "-f") != 0) {
  146.       fprintf(stderr, "Usage: sound2sun [-f frequency] infile outfile\n");
  147.       exit(1);
  148.     } else {
  149.       frequency = atoi(argv[2]);
  150.     }
  151.   } else {
  152.     frequency = DEFAULT_FREQUENCY;
  153.   }
  154.  
  155.   if ((infile = fopen(argv[argc-2], "r")) == NULL) {
  156.     perror("Error opening infile");
  157.     exit(0);
  158.   }
  159.  
  160.   if ((outfile = fopen(argv[argc-1], "w")) == NULL) {
  161.     perror("Error opening outfile");
  162.     exit(0);
  163.   }
  164.  
  165.   /* increment is the number of bytes to read each time */
  166.  
  167.   increment = frequency / 8000;
  168.  
  169.   ch = fgetc(infile);
  170.  
  171.   while (!feof(infile)) {
  172.  
  173.     /* convert the excess 128 to two's complement */
  174.  
  175.     chr = 0x80 - ch;
  176.  
  177.     /* increase the volume */
  178.     /* convert to uLAW */
  179.  
  180.     ulaw = cvt(chr * 16);
  181.  
  182.     /* output it */
  183.  
  184.     fputc((char) ulaw, outfile);
  185.  
  186.     /* skip enough input bytes to compensate for sampling frequency diff */
  187.  
  188.     sum += increment;
  189.  
  190.     while(sum > 0) {
  191.       if (!feof(infile)) ch = fgetc(infile);
  192.       sum--;
  193.     }
  194.  
  195.   }
  196.  
  197.   fclose(infile);
  198.   fclose(outfile);
  199. }
  200.  
  201.